﻿using System;
using System.Text;
using Microsoft.Win32;
using System.Diagnostics;

namespace Common
{
    /// <summary>
    /// FileCompressionOrDecompression_RAR 的摘要说明。
    /// </summary>
    public class ZipManager
    {
        //      p.StartInfo.Arguments=" a -r "+strR+" "+strF;   //默认压缩到RAR
        //      p.StartInfo.Arguments=" a -afzip "+strR+" "+strF;   //压缩到Zip
        //      p.StartInfo.Arguments=" m "+strR+" "+strF;     //压缩到RAR并删除原文件
        //      p.StartInfo.Arguments=" a -p123456 "+strR+" "+strF;   //密码为123456
        //      p.StartInfo.Arguments=" x "+strR+" "+strF;   //从RAR解压缩,文件名要一致
        //      p.StartInfo.Arguments=" x -p123456 "+strR+" "+strF;   //解压加密的RAR
        //      " x -o+" 覆盖已经存在的文件
        //      " x -o-" 不覆盖已经存在的文件
        //      " x " + strzipPath + "   qingyuan.txt "' + strtxtPath  
        //      只从压缩包中解压出qingyuan.txt,其它文件不予解压
        //      " -y"   对所有询问回应为"是",即发生错误也不弹出窗口
        //      " -cl"   转换文件名为小写字母

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="DFilePath">需要压缩的文件夹或者单个文件</param>
        /// <param name="DRARName">生成压缩文件的文件名</param>
        /// <param name="DRARPath">生成压缩文件保存路径</param>
        /// <returns></returns>
        public  bool CompressRAR(string DFilePath, string DRARName, string DRARPath)
        {
            String the_rar;
            RegistryKey the_Reg;
            Object the_Obj;
            String the_Info;
            ProcessStartInfo the_StartInfo;
            Process the_Process;
            try
            {
                the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRAR.exe\Shell\Open\Command");
                the_Obj = the_Reg.GetValue("");
                the_rar = the_Obj.ToString();
                the_Reg.Close();
                the_rar = the_rar.Substring(1, the_rar.Length - 7);
                the_Info = String.Format(" a  {0} {1} -ep1", DRARName, DFilePath); //命令 + 压缩后文件名 + 被压缩的文件或者路径
                the_StartInfo = new ProcessStartInfo();
                the_StartInfo.FileName = the_rar;
                the_StartInfo.Arguments = the_Info;
                the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                the_StartInfo.WorkingDirectory = DRARPath;//RaR文件的存放目录。
                the_Process = new Process();
                the_Process.StartInfo = the_StartInfo;
                the_Process.Start();
                the_Process.WaitForExit();
                the_Process.Close();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// 解压缩到指定文件夹
        /// </summary>
        /// <param name="RARFilePath">压缩文件存在的目录 </param>
        /// <param name="RARFileName">压缩文件名称 </param>
        /// <param name="UnRARFilePath">解压到文件夹</param>
        /// <param name="isCovering">是否覆盖原来文件</param>
        /// <returns></returns>
        public  bool DecompressionRAR(string RARFilePath, string RARFileName, string UnRARFilePath, bool isCovering)
        {
            //解压缩
            String the_rar;
            RegistryKey the_Reg;
            Object the_Obj;
            String the_Info;
            ProcessStartInfo the_StartInfo;
            Process the_Process;
            try
            {
                the_Reg = Registry.ClassesRoot.OpenSubKey(@"Applications\WinRar.exe\Shell\Open\Command");
                the_Obj = the_Reg.GetValue("");
                the_rar = the_Obj.ToString();
                the_Reg.Close();
                the_rar = the_rar.Substring(1, the_rar.Length - 7);
                if (isCovering)
                {
                    the_Info = String.Format(@"x -o+ {0}{1} {2}", RARFilePath, RARFileName, UnRARFilePath);
                }
                else
                {
                    the_Info = String.Format(@"x -o- {0}{1} {2}", RARFilePath, RARFileName, UnRARFilePath);
                }
                the_StartInfo = new ProcessStartInfo();
                the_StartInfo.FileName = the_rar;
                the_StartInfo.Arguments = the_Info;
                the_StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                the_Process = new Process();
                the_Process.StartInfo = the_StartInfo;
                the_Process.Start();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }
}